<?php
/**
 * 所有方法的基类
 * @author cui lixin
 */
class base
{

	/**
	 * 当调用一个未定义的属性时，此方法会被触发，传递的参数是被访问的属性名。
	 * @param unknown_type $name
	 * @return CException if the property or event is not defined
	 */
	public function __get($name)
	{
		$getter = 'get'.$name;

		if(method_exists($this,$getter))
		{
			return $this->$getter();
		}
		else
		{
			throw_exception::process(new Exception('调用一个未定义的属性:' . $name, 7));
		}
	}

	/**
	 * 给一个未定义的属性赋值时，此方法会被触发，传递的参数是被设置的属性名和值。
	 * @param unknown_type $name
	 * @param unknown_type $value
	 */
	public function __set($name,$value)
	{
		$setter = 'set'.ucfirst($name);
		if(method_exists($this,$setter))
		{
			return $this->$setter($value);
		}
		else
		{
			throw_exception::process(new Exception('给一个未定义的属性赋值:' . $name . ':' . $value, 8));
		}
	}

	/**
	 * 当在一个未定义的属性上调用unset()函数时调用此方法
	 * @param unknown_type $name
	 */
	public function __unset($name)
	{
		$setter = 'set'.$name;
		if(method_exists($this,$setter))
		{
			$this->$setter(null);
		}
		else if(method_exists($this,'get'.$name))
		{
			throw_exception::process(new Exception('在一个未定义的属性上执行UNSET:' . $name, 9));
		}
	}

	/**
	 * 这个方法用来监视一个对象中的其它方法.
	 * 如果你试着调用一个对象中不存在的方法.__call 方法将会被自动调用.
	 * @param  $name
	 * @param  $args
	 */
	public function __call($name,$args)
	{
		throw_exception::process(new Exception('调用一个不存在的方法:' . $name, 10));
	}


}

?>